MyBatis 您所在的位置:网站首页 数据库 条件 MyBatis

MyBatis

2024-07-09 15:12| 来源: 网络整理| 查看: 265

推荐:MyBatis Plus汇总

MyBatis-Plus 条件构造器之实体(Entity)查询

首先创建一个数据库表,如下图所示: 在这里插入图片描述

然后创建一个Spring Boot项目,pom.xml和配置如下:

4.0.0 org.kaven mybatis-plus 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.3.4.RELEASE 1.8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test org.springframework.boot spring-boot-starter-webflux com.baomidou mybatis-plus-boot-starter 3.4.0 mysql mysql-connector-java 5.1.49 org.projectlombok lombok org.springframework.boot spring-boot-maven-plugin spring: application: name: mybatis-plus datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: ITkaven@123 url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false server: port: 8085 logging: level: root: warn com.kaven.mybatisplus.dao: trace pattern: console: '%p%m%n' mybatis-plus: mapper-locations: classpath:mappers/*.xml

实体类User:

package com.kaven.mybatisplus.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("user") @Data public class User { @TableId private String id; @TableField("username") private String username; @TableField("password") private String password; @TableField("age") private Integer age; /** * 使用 @TableField(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中 * 使用 transient 、 static 修饰属性也不会插入数据库中 */ @TableField(exist = false) private String phone; }

Mapper接口UserMapper:

package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.kaven.mybatisplus.entity.User; import org.springframework.stereotype.Component; @Component public interface UserMapper extends BaseMapper {}

启动类:

package com.kaven.mybatisplus; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan(basePackages = "com.kaven.mybatisplus.dao") public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class , args); } }

@MapperScan(basePackages = "com.kaven.mybatisplus.dao")这个一定要加上。

我们先在数据库中添加几行数据,方便演示。 在这里插入图片描述 MyBatis-Plus 条件构造器还可以通过实体(Entity)进行查询。

查询username为kaven,age等于22。

只需要创建一个这样的实体实例,再将它传给条件构造器的构造方法即可。

package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.Arrays; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperEntityTest { @Autowired private UserMapper userMapper; @Test public void selectList(){ User user = new User(); user.setUsername("kaven"); user.setAge(22); QueryWrapper userQueryWrapper = new QueryWrapper(user); List userList = userMapper.selectList(userQueryWrapper); userList.forEach(System.out::println); } }

结果如下: 在这里插入图片描述 显然是正确的。

我们想象一下应用场景,username的匹配方式不一定是相等,还可以是包含,age也可以是大于、小于,当然我们可以将对象属性用于条件构造器中来实现,如:

userQueryWrapper.likeRight("username" , user.getUsername()) .or() .ge("age" , user.getAge()) .orderByDesc("age") .orderByAsc("id");

但这可能会很繁琐,如果对象属性比较多,需要这样的查询也很多,这会导致工作量很大;使用MyBatis-Plus可以很简单的解决掉该问题。

这里需要修改一下实体类。

package com.kaven.mybatisplus.entity; import com.baomidou.mybatisplus.annotation.SqlCondition; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("user") @Data public class User { @TableId private String id; @TableField(value = "username" , condition = SqlCondition.LIKE) private String username; @TableField("password") private String password; @TableField(value = "age" , condition = "%s;#{%s}") private Integer age; /** * 使用 @TableField(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中 * 使用 transient 、 static 修饰属性也不会插入数据库中 */ @TableField(exist = false) private String phone; }

其实就是在@TableField()注解中加了condition参数,就是一个匹配条件,这个参数该怎么赋值,可以参考SqlCondition这个类。 源码如下:

package com.baomidou.mybatisplus.annotation; public class SqlCondition { public static final String EQUAL = "%s=#{%s}"; public static final String NOT_EQUAL = "%s;;#{%s}"; public static final String LIKE = "%s LIKE CONCAT('%%',#{%s},'%%')"; public static final String LIKE_LEFT = "%s LIKE CONCAT('%%',#{%s})"; public static final String LIKE_RIGHT = "%s LIKE CONCAT(#{%s},'%%')"; public SqlCondition() { } }

如果这个类没有你想要的condition参数,你可以模仿它这里面的写法来构造自己的condition参数,像上面修改的实体类中就有condition = "%s;#{%s},它就是表示age要大于传过来的参数。

package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperEntityTest { @Autowired private UserMapper userMapper; @Test public void selectList(){ User user = new User(); user.setUsername("k"); user.setAge(22); // 后面还可以加字符串,表示需要输出的列名 QueryWrapper userQueryWrapper = new QueryWrapper(user , "username" , "age"); List userList = userMapper.selectList(userQueryWrapper); userList.forEach(System.out::println); } }

结果如下: 在这里插入图片描述

显然也是正确的。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有